package pe.com.bbva.modpre.persistencia.hibernate;

import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import pe.com.bbva.modpre.dominio.CrPe;
import pe.com.bbva.modpre.dominio.Valor;
import pe.com.bbva.modpre.persistencia.CrPeDAO;
import pe.com.bbva.modpre.persistencia.ValorDAO;
import pe.com.bbva.modpre.utileria.Busqueda;
import pe.com.bbva.modpre.utileria.ModpreUtil;

@Repository
@SuppressWarnings("serial")
public class CrPeHibernate extends BaseHibernate<CrPe, Long> 
implements CrPeDAO {
	
	@Autowired
	ValorDAO valorDAO;
	
	@Autowired
	public CrPeHibernate(SessionFactory sessionFactory){
		setSessionFactory(sessionFactory);
	}

	@Override
	public List<CrPe> busquedaCrPe(Map<String,Object> map) {
		Busqueda filtro = Busqueda.forClass(CrPe.class);
		filtro.createAlias("estado", "e");
		filtro.add(Restrictions.eq("e.codigo",Valor.CODIGO.ACTIVO));
		if(map!=null){
			CrPe crPe = new CrPe();
			crPe.setCodigoCrPe(ModpreUtil.convertirObjetoLong(map.get("codigoCrPe")));
			crPe.setEscalaRating(ModpreUtil.convertirObjetoString(map.get("escalaRating")));
			crPe.setCodigoProducto(ModpreUtil.convertirObjetoLong(map.get("codigoProducto")));
			crPe.setCodigoPuntajeBuro(ModpreUtil.convertirObjetoLong(map.get("puntajeBuro")));
			crPe.setCodigoAntiguedadCliente(ModpreUtil.convertirObjetoLong(map.get("antiguedadCliente")));
			crPe.setCodigoLtv(ModpreUtil.convertirObjetoLong(map.get("ltv")));
			crPe.setCodigoViviendaDivisa(ModpreUtil.convertirObjetoLong(map.get("codigoViviendaDivisa")));
			crPe.setCodigoVivienda(ModpreUtil.convertirObjetoLong(map.get("codigoVivienda")));
			crPe.setCodigoDivisa(ModpreUtil.convertirObjetoLong(map.get("codigoDivisa")));
			crPe.setPd(ModpreUtil.convertirObjetoBigDecimal(map.get("pd_1")));
			crPe.setLgd(ModpreUtil.convertirObjetoBigDecimal(map.get("lgd_1")));
			crPe.setPe(ModpreUtil.convertirObjetoBigDecimal(map.get("pe_1")));
			crPe.setCr(ModpreUtil.convertirObjetoBigDecimal(map.get("cr_1")));
			crPe.setCodigoPlazo(ModpreUtil.convertirObjetoLong(map.get("codigoPlazo")));
			Valor tipoCarga = new Valor();
			tipoCarga.setNombre(ModpreUtil.convertirObjetoString(map.get("tipoCargaNombre")));
			crPe.setTipoCarga(tipoCarga);
			Valor estado=new Valor();
			estado.setNombre(ModpreUtil.convertirObjetoString(map.get("estadoNombre")));
			crPe.setEstado(estado);
			
			if(crPe.getCodigoCrPe()!=null){
				filtro.add(Restrictions.eq("codigoCrPe",crPe.getCodigoCrPe()));
			}
			if(crPe.getCodigoPlazo()!=null){
				filtro.add(Restrictions.eq("codigoPlazo",crPe.getCodigoPlazo()));
			}
			if(!crPe.getEscalaRating().isEmpty()){
				filtro.add(Restrictions.ilike("escalaRating",crPe.getEscalaRating(), MatchMode.ANYWHERE));
			}
			if(crPe.getCodigoProducto()!=null){
				filtro.add(Restrictions.eq("codigoProducto",crPe.getCodigoProducto()));
			}
			if(crPe.getCodigoPuntajeBuro()!=null){
				filtro.add(Restrictions.eq("codigoPuntajeBuro",crPe.getCodigoPuntajeBuro()));
			}
			if(crPe.getCodigoAntiguedadCliente()!=null){
				filtro.add(Restrictions.eq("codigoAntiguedadCliente",crPe.getCodigoAntiguedadCliente()));
			}
			if(crPe.getCodigoLtv()!=null){
				filtro.add(Restrictions.eq("codigoLtv",crPe.getCodigoLtv()));
			}
			if(crPe.getCodigoViviendaDivisa()!=null){
				filtro.add(Restrictions.eq("codigoViviendaDivisa",crPe.getCodigoViviendaDivisa()));
			}
			if(crPe.getCodigoVivienda()!=null){
				filtro.add(Restrictions.eq("codigoVivienda",crPe.getCodigoVivienda()));
			}
			if(crPe.getCodigoDivisa()!=null){
				filtro.add(Restrictions.eq("codigoDivisa",crPe.getCodigoDivisa()));
			}
			if(crPe.getPd()!=null && ModpreUtil.convertirObjetoBigDecimal(map.get("pd_2"))!=null){
				filtro.add(Restrictions.between("pd",crPe.getPd(),ModpreUtil.convertirObjetoBigDecimal(map.get("pd_2"))));
			}
			if(crPe.getLgd()!=null && ModpreUtil.convertirObjetoBigDecimal(map.get("lgd_2"))!=null){
				filtro.add(Restrictions.between("lgd",crPe.getLgd(),ModpreUtil.convertirObjetoBigDecimal(map.get("lgd_2"))));
			}
			if(crPe.getPe()!=null && ModpreUtil.convertirObjetoBigDecimal(map.get("pe_2"))!=null){
				filtro.add(Restrictions.between("pe",crPe.getPe(),ModpreUtil.convertirObjetoBigDecimal(map.get("pe_2"))));
			}
			if(crPe.getCr()!=null && ModpreUtil.convertirObjetoBigDecimal(map.get("cr_2"))!=null){
				filtro.add(Restrictions.between("cr",crPe.getCr(),ModpreUtil.convertirObjetoBigDecimal(map.get("cr_2"))));
			}
			if(crPe.getTipoCarga()!=null){
				filtro.createAlias("tipoCarga", "t");
				filtro.add(Restrictions.ilike("t.nombre",crPe.getTipoCarga().getNombre(), MatchMode.ANYWHERE));
			}
			if(crPe.getEstado()!=null){
				filtro.add(Restrictions.ilike("e.nombre",crPe.getEstado().getNombre(), MatchMode.ANYWHERE));
			}
		}
		return buscar(filtro);
	}

	@Override
	public CrPe obtenerCrPe(CrPe crPe) {
		Busqueda filtro = Busqueda.forClass(CrPe.class);
		if(crPe!=null){
			if(crPe.getEscalaRating()!=null){
				filtro.add(Restrictions.eq("escalaRating",crPe.getEscalaRating()));
			}
			if(crPe.getCodigoProducto()!=null){
				filtro.add(Restrictions.eq("codigoProducto",crPe.getCodigoProducto()));
			}
			if(crPe.getCodigoPuntajeBuro()!=null){
				filtro.add(Restrictions.eq("codigoPuntajeBuro",crPe.getCodigoPuntajeBuro()));
			}
			if(crPe.getCodigoAntiguedadCliente()!=null){
				filtro.add(Restrictions.eq("codigoAntiguedadCliente",crPe.getCodigoAntiguedadCliente()));
			}
			if(crPe.getCodigoDivisa()!=null){
				filtro.add(Restrictions.eq("codigoDivisa",crPe.getCodigoDivisa()));
			}
			if(crPe.getCodigoViviendaDivisa()!=null){
				filtro.add(Restrictions.eq("codigoViviendaDivisa",crPe.getCodigoViviendaDivisa()));
			}
			if(crPe.getCodigoLtv()!=null){
				filtro.add(Restrictions.eq("codigoLtv",crPe.getCodigoLtv()));
			}
			if(crPe.getCodigoPlazo()!=null){
				filtro.add(Restrictions.eq("codigoPlazo",crPe.getCodigoPlazo()));
			}
			
			if(crPe.getEstado()!=null){
				filtro.createAlias("estado", "e");
				filtro.add(Restrictions.eq("e.codigo",crPe.getEstado().getCodigo()));
			}
			if(crPe.getTipoCarga()!=null){
				filtro.createAlias("tipoCarga", "t");
				filtro.add(Restrictions.eq("t.codigo",crPe.getTipoCarga().getCodigo()));
			}
		}
		return obtener(filtro);
	}

	@Override
	@Transactional
	public void actualizarCrPeEstado(String codigoEstado, Valor tipoCarga) {
		Valor estado=valorDAO.obtenerValorxCodigo(codigoEstado);
		Query q = getSession().createQuery("update CrPe set estado = :codigoEstado where tipoCarga = :tipoCarga");
		q.setLong("codigoEstado", estado.getId());
		q.setLong("tipoCarga", tipoCarga.getId());
		q.executeUpdate();
	}
}
